import socket
import struct


def get_network_time():
    """从阿里云NTP服务器获取时间"""
    # 阿里云NTP服务器地址
    NTP_SERVER = "ntp.aliyun.com"
    NTP_PORT = 123
    
    try:
        # 创建UDP socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.settimeout(5)  # 设置超时时间
        
        # 构建NTP请求包
        ntp_request = bytearray(48)
        ntp_request[0] = 0x1B  # LI=0, Version=3, Mode=3 (Client)
        
        # 发送请求
        sock.sendto(ntp_request, (NTP_SERVER, NTP_PORT))
        
        # 接收响应
        data, addr = sock.recvfrom(1024)
        sock.close()
        
        # 解析NTP响应
        if len(data) >= 48:
            # 提取传输时间戳（第40-47字节）
            transmit_time = struct.unpack('!Q', data[40:48])[0]
            
            # NTP时间戳从1900年1月1日开始，需要转换为Unix时间戳
            # 减去70年的秒数 (1900-1970)
            unix_time = transmit_time / 2**32 - 2208988800
            
            # 转换为本地时间
            import time
            local_time = time.localtime(unix_time)
            
            return local_time.tm_hour, local_time.tm_min, local_time.tm_sec
        else:
            return None, None, None
            
    except Exception as e:
        print(f"获取网络时间失败: {e}")
        return None, None, None


if __name__ == '__main__':
    h, m, s = get_network_time()
    print(h, m, s)